#ifndef COMMON_H
#define COMMON_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <pthread.h>

// 定义常量
#define SERVER_PORT 8888
#define SERVER_IP "127.0.0.1"
#define BUFFER_SIZE (1024 * 1024)  // 1MB的块大小
#define MAX_QUEUE_SIZE 10          // 队列最大长度

// 文件传输协议包类型
typedef enum {
    FILE_INFO,      // 文件信息包
    FILE_DATA,      // 文件数据包
    FILE_END,       // 文件结束包
    FILE_RESUME,    // 断点续传请求包
    FILE_ERROR      // 错误包
} PacketType;

// 文件信息包结构体
typedef struct {
    PacketType type;            // 包类型
    char filename[256];         // 文件名
    size_t filesize;            // 文件总大小
    int block_size;             // 块大小
} FileInfoPacket;

// 文件数据包结构体
typedef struct {
    PacketType type;            // 包类型
    size_t block_index;         // 块索引
    size_t data_size;           // 数据大小
    char data[BUFFER_SIZE];     // 数据内容
} FileDataPacket;

// 文件结束包结构体
typedef struct {
    PacketType type;            // 包类型
    size_t total_blocks;        // 总块数
    int status;                 // 状态码
} FileEndPacket;

// 断点续传请求包结构体
typedef struct {
    PacketType type;            // 包类型
    char filename[256];         // 文件名
    size_t last_block;          // 最后接收到的块索引
} FileResumePacket;

// 队列节点结构
typedef struct QueueNode {
    void* data;                 // 数据指针
    size_t size;                // 数据大小
    struct QueueNode* next;     // 下一个节点
} QueueNode;

// 队列结构
typedef struct {
    QueueNode* front;           // 队列头
    QueueNode* rear;            // 队列尾
    int size;                   // 当前队列大小
    pthread_mutex_t mutex;      // 互斥锁
    pthread_cond_t not_empty;   // 非空条件变量
    pthread_cond_t not_full;    // 非满条件变量
} Queue;

// 队列操作函数声明
Queue* queue_init();
void queue_destroy(Queue* queue);
int queue_push(Queue* queue, void* data, size_t size);
void* queue_pop(Queue* queue, size_t* size);
int queue_is_empty(Queue* queue);
int queue_is_full(Queue* queue);

// 错误处理宏
#define HANDLE_ERROR(msg) \
    do { perror(msg); exit(EXIT_FAILURE); } while (0)

#endif /* COMMON_H */ 